; ** por compatibilidad se omiten tildes **
; ==============================================================================
; TRABAJO PRACTICO 3 - System Programming - ORGANIZACION DE COMPUTADOR II - FCEN
; ==============================================================================
; definicion de rutinas de atencion de interrupciones

%include "imprimir.mac"

BITS 32

sched_tarea_offset:     dd 0x00
sched_tarea_selector:   dw 0x00

;; PIC
extern fin_intr_pic1

;; Sched
extern sched_proximo_indice
extern sched_anterior_indice
extern desalojar_tarea
extern sched_pasar_a_idle
;; Game
extern game_mover
extern game_misil
extern game_minar
;extern screen_proximo_reloj
;;
;; Definición de MACROS
;; -------------------------------------------------------------------------- ;;

%macro ISR 1
global _isr%1
_isr%1:
	pusha
	;xor ecx, ecx
	mov al, %1
	cmp al, 10
	jl .Unidades
	xor ebx, ebx
	.Decenas:
	cmp al, 10
	jl .FinDecenas
	add bl, 1
	sub al, 10
	jmp .Decenas
	.FinDecenas:
	mov bh, 00000111b
	add bl, 48
	mov word [fs:ecx], bx
	add ecx, 2
	.Unidades:
	add al, 48
	mov ah, 00000111b
	mov word [fs:ecx], ax
	popa
	iret

%endmacro

;;
;; Datos
;; -------------------------------------------------------------------------- ;;
; Scheduler
isrnumero:           dd 0x00000000
isrClock:            db '|/-\'

;;
;; Rutina de atención de las EXCEPCIONES
;; -------------------------------------------------------------------------- ;;
ISR 0
ISR 1
ISR 2
ISR 3
ISR 4
ISR 5
ISR 6
ISR 7
ISR 8
ISR 9
ISR 10
ISR 11
ISR 12
;ISR 13
;;ISR 14
ISR 15
ISR 16
ISR 17
ISR 18
ISR 19


;;
;; Rutina de atención del RELOJ
;; -------------------------------------------------------------------------- ;;
global _isr32
_isr32:

	xchg bx, bx
	cli
	pusha
	call fin_intr_pic1
	call proximo_reloj	
	mov eax, 0
	push eax
	call sched_proximo_indice
	add esp, 8		;por el push eax previo a sched_proximo_indice  
	cmp ax, 16
	je .esC

	cmp ax, 15
	je .esQ

	.esQ:
	jmp 0x78:0
	jmp .fin
	
	.esC:
	jmp 0x80:0 	

.fin:
	popa
	sti
	iret
;;
;; Rutina de atención del TECLADO
;; -------------------------------------------------------------------------- ;;
global _isr33
_isr33:
	cli
	pusha
	call fin_intr_pic1
	in al, 0x60	
	cmp al, 0x19
	je .letraP
	cmp al, 0xc
	jge .volver
	dec al
	add al, 48
	mov ah, 00000111b
	mov word [fs:0], ax
	jmp .volver	
	.letraP:
	
	mov word [fs:0],0x7750
	.volver:	
	;mov word [fs:0],0x7750
	popa
	sti
	iret
;;
;; Rutinas de atención de las SYSCALLS
;; -------------------------------------------------------------------------- ;;
%define SYS_MOVER     0x83D
%define SYS_MISIL     0x911
%define SYS_MINAR     0x355

;; Funciones Auxiliares
;; -------------------------------------------------------------------------- ;;
proximo_reloj:

	pushad
        inc DWORD [isrnumero]
        mov ebx, [isrnumero]
        cmp ebx, 0x4
        jl .ok
                mov DWORD [isrnumero], 0x0
                mov ebx, 0
        .ok:
                add ebx, isrClock
                imprimir_texto_mp ebx, 1, 0x0f, 49, 79
                popad
        ret
        
;;...............................................................................;;


global _isr13

_isr13:
	cli
	xchg bx, bx
;	call fin_intr_pic1
;	call proximo_reloj	
;	call sched_pasar_a_idle  
;	cmp ax, 16
;	je .esC1

;	cmp ax, 15
;	je .esQ1

;	.esQ1:
;	jmp 0x78:0
;	jmp .fin2
	
;	.esC1:
;	jmp 0x80:0 	

;.fin2:
;	popa
	sti
	iret

global _isr14

_isr14:


	cli

	xchg bx, bx
	
;	call desalojar_tarea		
       

	iret 

global _isr0x52

_isr0x52:
	cli
	
	push esi
	push edx
	push ecx
	push ebx

	cmp eax, 0x83D
	jne .noDesp
	call game_mover
	jmp .fin

.noDesp:

	cmp eax, 0x911
	jne .noLanMis
	call game_misil
	jmp .fin

.noLanMis:	 

	cmp eax, 0x355
	jne .noMiner
	call game_minar 
	jmp .fin

.fin:
.noMiner:

	sti

	pop ebx
	pop ecx
	pop edx
	pop esi

	iret
